create or replace
PROCEDURE "SP_LIQUIDACION" (p_idPrograma IN NUMBER, 
                            p_idPeriodo IN NUMBER, 
                            p_coUsuarioCreador IN VARCHAR2,
                            p_coPeriodoLiquidacion OUT NUMBER )  

IS

    vaIdPeriodoPrograma number;
    vaIdHistorico number;   
    daFechaInicioLiquidacion varchar2(10);
    daFechaFinLiquidacion varchar2(10);
    coPeriodoLiquidacion number;
    coCliente number;
    cantidadM3 number;
    vaMetaAnterior number;
    vaPrimeraMeta number;
    vaMetaAlcanzada number;
    idclpm_liquidacion number;
    idclpm_historial_liquidacion number;
    idclpr_periodo_liquidacion number;   
    contador number;
    vaCosto number;
    
    cursor metas is
      select de_meta as deMeta, va_costo as vaCosto, va_meta as vaMeta
        from clpd_meta  
        where clpb_programa=p_idPrograma and st_meta='Y'  
      order by va_meta asc;            
BEGIN
    
    coPeriodoLiquidacion := null;

    --Obteniendo las fechas de las cuales debemos obtener las ventas
    select to_char(pp.da_fecha_inicio_liq, 'dd/MM/yyyy'), to_char(da_fecha_fin_liq, 'dd/MM/yyyy') into 
            daFechaInicioLiquidacion, daFechaFinLiquidacion 
    from clpr_periodo_programa pp where pp.co_programa = p_idPrograma and pp.id = p_idPeriodo;
    
    dbms_output.put_line('daFechaInicioLiquidacion ' || daFechaInicioLiquidacion);
    dbms_output.put_line('daFechaFinLiquidacion ' || daFechaFinLiquidacion); 
    
    select count(*) into contador  from clpr_periodo_liquidacion 
    where co_programa = p_idPrograma
        and da_fecha_inicio = to_date(daFechaInicioLiquidacion,'dd/MM/yyyy')
        and da_fecha_fin = to_date(daFechaFinLiquidacion,'dd/MM/yyyy');
        
    dbms_output.put_line('contador ' || contador);          
    
    if (contador > 0) then    

      select id into coPeriodoLiquidacion from clpr_periodo_liquidacion 
      where co_programa = p_idPrograma
        and da_fecha_inicio = to_date(daFechaInicioLiquidacion,'dd/MM/yyyy')
        and da_fecha_fin = to_date(daFechaFinLiquidacion,'dd/MM/yyyy');      
    
      delete clpm_historial_liquidacion where co_periodo_liquidacion = coPeriodoLiquidacion; 
      delete clpm_liquidacion where co_periodo_liquidacion = coperiodoliquidacion;  
      
      dbms_output.put_line('select for coPeriodoLiquidacion ' || coPeriodoLiquidacion);   
      
    else 
        select SEQ_PERIODO_LIQUIDACION.NEXTVAL into coPeriodoLiquidacion from dual;    
       
        dbms_output.put_line('coPeriodoLiquidacion ' ||coPeriodoLiquidacion);
        insert into clpr_periodo_liquidacion (id,
            da_fecha_inicio,
            da_fecha_fin,
            st_enviado,
            st_periodo_liquidacion, 
            co_programa)
            values(coPeriodoLiquidacion,
            to_date(daFechaInicioLiquidacion, 'dd/MM/yyyy'),
            to_date(daFechaFinLiquidacion, 'dd/MM/yyyy'),
            'Y',
            'Y',
            p_idprograma);       
       
       dbms_output.put_line('SEQ_PERIODO_LIQUIDACION.NEXTVAL for coPeriodoLiquidacion ' || coPeriodoLiquidacion);   
    end if;
    
    p_coPeriodoLiquidacion := coPeriodoLiquidacion;
    --dbms_output.put_line('p_coPeriodoLiquidacion ' || p_coPeriodoLiquidacion); 
    
    select min(va_meta) into vaPrimeraMeta 
      from clpd_meta  
      where clpb_programa = p_idPrograma and st_meta='Y'; 
      
    for cliente in 
              (     
                select  clipro.clpb_cliente_persona as coCliente, sum(venta.va_cantidad) as cantidadM3
                from clpm_venta venta join clpr_cliente_programa clipro on venta.clpb_cliente_persona = clipro.clpb_cliente_persona 
                    join clpb_programa programa on clipro.clpb_programa = programa.id  
                where programa.id = p_idPrograma 
                  and venta.clpb_cliente_persona is not null  
                  and to_date(to_char(venta.da_fecha_venta,'dd/MM/yyyy'),'dd/MM/yyyy') between 
                                      to_date(daFechaInicioLiquidacion, 'dd/MM/yyyy')  and 
                                      to_date(daFechaFinLiquidacion, 'dd/MM/yyyy') 
                  and venta.st_venta='A'                        
                group by clipro.clpb_cliente_persona                          
              )
      loop
                  
          if cliente.cantidadM3 < vaPrimeraMeta then           
            dbms_output.put_line('NM ');                        
          else
        
            if cliente.cantidadM3 >= vaPrimeraMeta then
              
              vaMetaAnterior := vaPrimeraMeta;
              for meta in metas
                loop
                  
                  if cliente.cantidadM3 >= meta.vaMeta then                  
                    vaMetaAnterior := meta.vaMeta;  
                    vaCosto := meta.vaCosto;
                  end if;
                  
                end loop;    
                     
                 select SEQ_LIQUIDACION.NEXTVAL into idclpm_liquidacion from dual;
                 
                 dbms_output.put_line('SEQ_LIQUIDACION.NEXTVAL ' ||idclpm_liquidacion);
                 
                  insert into clpm_liquidacion( id, st_liquidacion, va_cantidad, va_meta,
                      co_cliente_persona, co_periodo_liquidacion, da_fecha_creacion, co_usuario_creador, VA_COSTO)                               
                  values(idclpm_liquidacion, 'Y', cliente.cantidadM3, vaMetaAnterior,
                      cliente.coCliente, coPeriodoLiquidacion, sysdate, p_coUsuarioCreador, vaCosto);                          
            
            end if;            
          end if;  

          select SEQ_HISTORIAL_LIQUIDACION.NEXTVAL into idclpm_historial_liquidacion from dual;
          
          dbms_output.put_line('SEQ_HISTORIAL_LIQUIDACION.NEXTVAL ' ||idclpm_historial_liquidacion);
              
          insert into clpm_historial_liquidacion( id, st_liquidacion, va_cantidad, co_cliente_persona, 
                  co_periodo_liquidacion, da_fecha_creacion, co_usuario_creador)  
                values(idclpm_historial_liquidacion, 'Y', cliente.cantidadM3, cliente.coCliente,
                     coPeriodoLiquidacion, sysdate, p_coUsuarioCreador);  
              
      end loop;  
      SP_LIQUIDACION_INCREMENTALES(p_idPrograma, p_coUsuarioCreador, coPeriodoLiquidacion, daFechaInicioLiquidacion, daFechaFinLiquidacion);
      commit;       

END SP_LIQUIDACION;